經歷了將近一周的時間,我們介紹了專案的起源、利用解說 DevOps 譜出大架構,再用敏捷開發實踐、以 User Story 製作出 Wireframe 與 Prototype,到昨天完成了易用性測試與回饋的蒐集。今天,讓我們一起進入 Spring Boot 的世界。
在開始前,我們先結束第一期的 Sprint,一起審視這一周的成果,並制定 Backlogs,同時規劃第二期 Sprint 的目標。昨天我們利用 Powerpoint (有一點羞恥) 快速的製作 Prototype 並進行成果展示與 Usability Test,這個 Prototype 與測試的回饋便是為這一期 Sprint 重要的 Increments。
(昨天測試的情況,From William 的 Iphone SE)
第一期的 Sprint 目標為釐清需求、繪製 Wireframe 和製作 Prototype 作為可交付的 increment
在這期的 Sptint 幾本上都有達到 Sprint Planning 時的目標,也收到了測試的回饋,不過也有幾個點是可以加強,甚至是需要拿出來檢討、並且改善的:
在初期的的操作上,每位參與測試者都能成功完成照片的選取,其實也是因為流程簡單用戶沒有什麼選擇。第二期的 Sprint,我們需要完成後端程式的撰寫,目標與驗收水準如下:
我依舊能記得與 Sprint Boot 的第一次相遇時的那一天,看著那個建一支 Class 後在瀏覽器上輸入 localhost:8080/hi 就能印出 Hello World 的框架,我內心只有一個疑問,啊 Tomcat 哪去了 ?
而 Spring 的官方網站對做了最貼切的解釋:
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run"
簡言之,Spring Boot 繼承了 Spring 框架原有的特性,並簡化 Spring 的 XML 配置,提高 PG 的開發效率,基本上已經成為目前 Java 開發人員必學的框架。某方面也讓 PG 變得不求甚解。
通常我們在服務建議書裡是這樣寫的:
Spring Boot 具備以下特性:
關於 Spring Boot 的介紹 (抄書) 就到上面為止,另外相信對 DevOps 有興趣的工程師應該都具備撰寫 API 的能力,所以這一期的鐵人賽就不帶大家從安裝 JDK 和 Spring Boot Hello World 做起,我們直接從專案的目錄結構開始介紹。
目前主流的 Java 專案的結構會使用 Controller、Service、Repository 的三層式架構,目的是藉由劃分職責,並逐層將依賴注入 (Dependency Injection, DI),來降低各層之間的耦合性。其三層分別為:
Controller (控制層): 負責接收 REST 的請求,同時呼叫 Service 的方法處理業務邏輯,RESTful API 的 endpoint 將被定在此層。
Service (服務層): 負責實踐業務邏輯,如資料運算、整理,並能呼叫 Repository 的方法從資料庫中獲取資料。在在開發上,此層資料夾中會建立 interface 定義業務功能,並交由一支 class 實作介面;另外,在此層也常會建立多個 dto (Data Transfer Objec) 用於包裝 po (Persistent Object) 與傳遞資料。
Repository (資料訪問層): 負責與資料庫溝通,實踐 CRUD,會依照 ORM 框架而有不同的實作方式。在此層會建立 dao (Data Access Object) 與 po (或叫 Entity、Bean)
在開發大型的專案中,甚至會使用 Multi-Module Project 的形式分割專案,先建立一個 Spring Boot 進入點以及多個 Maven projects,在 POM 檔內由上層模組去引用下層模組,並在打包構建時建立 Builders 將模組聚合,詳細的資訊可以參考 Will 保哥的 如何使用 Apache Maven 管裡多個模組的專案 (Multi-Module Project) 文章。
另外會依照專案的需求與習慣建立其他不同的包,如放置共用功能的 utils 等。
今天,我們審視了第一次 Sprint 的 increments、檢討不足的地方,並開啟了第二輪的 Sprint,接著又介紹了 Spring Boot 與主流的 Controller、Service、Repository 三層式架構。
明天,我們將逐步建構出 ColorCodeTag 的三層架構,並實踐照片轉色碼的功能,並祝大家周末愉快 ! (然後我終於能有時間去看電馭叛客:邊緣行者了...)